package Structure1.net.linearlist.impl;

import Structure1.net.linearlist.MyLinearList;

/**
 * Created by Administrator on 2017/3/9.
 */
//    链表存储方式实现线性表
public class MyLinkList<E> implements MyLinearList<E> {
//    定义一个变量引用，用来指向第一个结点，也就是说找到这个链表
    private Node<E> start;
//    记录当前链表的结点的个数
    private int size;

    @Override
    public void add(E e) {
//        如果当前的链表本身没有结点，添加的结点应该是第一个结点
//        如果当前链表有结点怎么添加？

//         1、先把新的元素构造成一个新结点，新结点的next为null；
//            使用Node构造函数实现一个新的结点
        Node<E> newNode = new Node<E>(e,null);
//         2、从链表的开头进行查询，直到找到当前链表的最后一个结点
//            首先定义一个变量C，让C指向链表的头结点，表示当前结点
        Node<E> c;
        c = start;
//            循环判断当前结点C是否有下一个结点
//            如果当前结点C的next为空，则C为最后一个结点，否则将C的下一个结点c.next赋值给C变成当前结点
        while (c.next != null) {
            c = c.next;
        }
//          3、把新结点赋值给原来链表的最后一个结点的next
        c.next = newNode;
//          4、结点个数要加1
        size++;
    }

    @Override
    public void add(int i, E e) {
//        如果i小于0或者大于size的话，增加不成功
        if (i < 0 || i >size) {
            throw new RuntimeException("插入元素的位置不对");
        }
//        先构造一个新的结点
        Node<E> newNode = new Node<E>(e,null);
//        如果i等于0，应该是增加到链表的最开始的位置
//        先把原链表链接到新结点的后面
        newNode.next = start;
//        让新结点变成头结点
        start = newNode;
//        如果i=size，则应该增加到最后一个位置

//        其他的情况，两个结点直接插入一个新的结点
//        使用两个变量p和c 分别记录要插入位置的前一个结点和后一个结点
        Node<E> c,p;
        c = start;
        p = null;

//        使用循环，根据i的值定位p和c的位置
         int j = 0;
         while (c.next != null && j < i) {
             p = c;     // 将p指向c当前的位置
             c = c.next;//c向后移动一位
             j++;
         }

    }

    @Override
    public void remove(int i) {

    }

    @Override
    public int indexOf(E e) {
        return 0;
    }

    @Override
    public E get(int i) {
        return null;
    }

    @Override
    public void edit(int i, E e) {

    }

    @Override
    public int getSize() {
        return 0;
    }

    @Override
    public void clear() {

    }

    @Override
    public boolean isEmpty() {
        return false;
    }
}
